import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {


    //创建二维数组管理数据,加载随机排列图片
    int[][] data = new int[4][4];
    //记录空白方块位置
    int x = 0;
    int y = 0;
    String path = "image/";

    int[][] win = new int[][]{
            {1,5,9,13},
            {2,6,10,14},
            {3,7,11,15},
            {4,8,12,0}};

    int step = 0;

    //创建选项下面的条目对象

    JMenuItem Miniwa_Tsumiki = new JMenuItem("御庭摘希");
    JMenuItem Nagisa_Kubo= new JMenuItem("久保渚咲");


    JMenuItem replayItem = new JMenuItem("重新游戏");
    JMenuItem reloginItem = new JMenuItem("重新登录");
    JMenuItem closeItem = new JMenuItem("关闭游戏");


    JMenuItem deverloperItem = new JMenuItem("开发者信息");
    JMenuItem pay = new JMenuItem("施舍");

    String girlname = "Miniwa_Tsumiki";

    public GameJFrame(){
        //初始化框架 ctrl+alt+m 一键抽取方法
        initJFrame();
        //初始化菜单
        initJMenu();

        //初始化数据(打乱图片)
        initData();
        //初始化图片
        initImage();
        //显示窗口,一切设置好了就可以显示了
        this.setVisible(true);
    }

    private void initData() {
        //创建一维数组存图片代号
        int[] temArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

        Random r = new Random();
        for (int i = 0; i < temArr.length; i++) {
            int index = r.nextInt(temArr.length);

            int temp = temArr[i];
            temArr[i] = temArr[index];
            temArr[index] = temp;
        }

        for(int i = 0; i < temArr.length;i++){
            if(temArr[i] == 0){
                x = i / 4;
                y = i % 4;
            }
                data[i / 4][i % 4] = temArr[i];


        }
    }

    private void initImage() {
//        //创建一个图片ImageIcon的对象
//        ImageIcon icon1 = new ImageIcon("D:\\Code\\Java\\study\\PuzzleGame\\image\\1\\cutter1.png");
//
//        //创建一个JLabel的对象(管理容器)
//        JLabel Jlabel1 = new JLabel(icon1);
//
//        //指定图像位置
//        Jlabel1.setBounds(0,0,108,108);
//
//        //将管理容器添加到界面中
//        //this.add(Jlabel1);
//        this.getContentPane().add(Jlabel1); //contenpane为隐藏的框
        //清空原本已经出现的图片
        this.getContentPane().removeAll();

        if (victory()){
            //显示胜利图标
            JLabel winJLabel = new JLabel(new ImageIcon("image/完成.jpg"));
            winJLabel.setBounds(324 + 83,324 + 134,108,108);
            winJLabel.setBorder(new BevelBorder(1));
            this.getContentPane().add(winJLabel);
        }

        //设置计步器
        JLabel stepCount = new JLabel("步数:" + step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);




        for (int i = 0; i < 4; i++) {
            for(int j = 0;j < 4;j++){
                //获取当前要加载图片的序号
                int num = data[i][j];
                //创建一个JLabel的对象(管理容器)
                JLabel Jlabel1 = new JLabel(new ImageIcon(path + girlname + "/cutter"+ num +".png"));

                //指定图像位置
                Jlabel1.setBounds(108 * j + 83,108 * i + 134,108,108);

                //给图片添加边框
                Jlabel1.setBorder(new BevelBorder(1));

                //将管理容器添加到界面中
                //this.add(Jlabel1);
                this.getContentPane().add(Jlabel1); //contenpane为隐藏的框

                this.getContentPane().repaint();
            }
        }
        //设置背景图片
        JLabel backgroud = new JLabel(new ImageIcon("image/background.png"));
        backgroud.setBounds(45,45,508,560);
        this.getContentPane().add(backgroud);
        this.getContentPane().repaint();
    }


    private void initJMenu() {
        //创建整个菜单对象
        JMenuBar jMenuBar= new JMenuBar();

        //创建菜单上面的两个对象
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");
        JMenu changeItem = new JMenu("更换图片");


        //将选项条目添加到对应选项
        changeItem.add(Miniwa_Tsumiki);
        changeItem.add(Nagisa_Kubo);
        functionJMenu.add(changeItem);
        functionJMenu.add(replayItem);
        functionJMenu.add(reloginItem);
        functionJMenu.add(closeItem);

        aboutJMenu.add(deverloperItem);
        aboutJMenu.add(pay);

        //给条目绑定事件
        changeItem.addActionListener(this);
        replayItem.addActionListener(this);
        reloginItem.addActionListener(this);
        closeItem.addActionListener(this);
        deverloperItem.addActionListener(this);
        pay.addActionListener(this);
        Nagisa_Kubo.addActionListener(this);
        Miniwa_Tsumiki.addActionListener(this);


        //将选项添加到菜单中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);

        //给界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void initJFrame() {
        //设置长宽
        this.setSize(603,680);
        //设置置顶窗口
        this.setAlwaysOnTop(true);
        //设置中间弹出
        this.setLocationRelativeTo(null);
        //设置窗口名
        this.setTitle("拼图单机版-HYH");
        //设置关闭模式,0,1,2,3
        this.setDefaultCloseOperation(3);
        //取消默认的居中放置
        this.setLayout(null);
        //给整个界面添加键盘监听事件
        this.addKeyListener(this);

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //按下不松时调用这个方法
    @Override
    public void keyPressed(KeyEvent e) {
            int code = e.getKeyCode();
            if (code == 65){
                //将界面的所有图像删除
                this.getContentPane().removeAll();
                //加载完整图片
                JLabel all = new JLabel(new ImageIcon(path + girlname + "/all.png"));
                all.setBounds(83,134,432,432);
                this.getContentPane().add(all);
                //刷新界面
                this.getContentPane().repaint();
            }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(victory()){
            return;
        }
        //对上,下,左,右,进行判断
        //左:37,上:38,右:39,下:40
        int code = e.getKeyCode();
        if(code == 37){
            if(y == 3){
                return;
            }
            System.out.println("向左移动");
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;
            step++;
            initImage();

        }else if(code == 38){
            if(x == 3){
                return;
            }
            System.out.println("向上移动");
            //将空白方块下方的数字赋值给空白方块
            data[x][y] = data[x+1][y];
            data[x+1][y] = 0;
            x++;
            step++;

            //调用方法加载图片
            initImage();

        }else if(code == 39){
            if(y == 0){
                return;
            }
            System.out.println("向右移动");
            data[x][y] = data[x][y-1];
            data[x][y-1] = 0;
            y--;
            step++;

            initImage();

        }else if(code == 40){
            if(x == 0){
                return;
            }
            System.out.println("向下移动");
            data[x][y] = data[x-1][y];
            data[x-1][y] = 0;
            x--;
            step++;

            initImage();
        }else if(code == 65){
            initImage();
        }else if(code == 87){
            data = new int[][]{
                    {1,5,9,13},
                    {2,6,10,14},
                    {3,7,11,15},
                    {4,8,12,0}
            };
            //将白块复位
            x = 3;
            y = 3;
            initImage();
        }
    }
    public boolean victory(){
        for (int i = 0; i < data.length; i++) {
            for(int j = 0;j<data[i].length;j++){
                if(data[i][j] != win[i][j]){
                    return false;
                  }

            }
        }
        //循环结束就完了
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        //获取当前被点击的条目对象
        Object obj = e.getSource();
        //判断
        if(obj == replayItem){
            System.out.println("重新游戏");
            step = 0;
            initData();
            initImage();


        }else if(obj == reloginItem){
            System.out.println("重新登录");
            //关闭当前游戏界面
            this.dispose();
            //打开登录界面
            new LoginJFrame();

        }else if(obj == closeItem){
            System.out.println("关闭游戏");
            //直接关闭虚拟机
            System.exit(0);

        }else if(obj == deverloperItem){
            System.out.println("弹出开发者选项");
            JDialog jDialog = new JDialog();
            jDialog.setTitle("加作者好友获取更多信息");
            // 创建管理图片的容器对象
            JLabel jLabel = new JLabel(new ImageIcon("image/developer1.jpg"));

            //设置宽高
            jLabel.setBounds(0,0,258,258);
            //图片添加到弹框
            jDialog.getContentPane().add(jLabel);
            //设置弹框大小
            jDialog.setSize(344,344);
            //置顶弹框
            jDialog.setAlwaysOnTop(true);
            //弹框居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭无法操作
            jDialog.setModal(true);
            //显示弹框
            jDialog.setVisible(true);

        }else if(obj == pay){
            System.out.println("弹出付款码");
            JDialog jDialog = new JDialog();
            jDialog.setTitle("就这点技术含量就想要钱，鬼");
            // 创建管理图片的容器对象
            JLabel jLabel = new JLabel(new ImageIcon("image/收款.jpg"));

            //设置宽高
            jLabel.setBounds(0,0,270,360);
            //图片添加到弹框
            jDialog.getContentPane().add(jLabel);
            //设置弹框大小
            jDialog.setSize(270,430);
            //置顶弹框
            jDialog.setAlwaysOnTop(true);
            //弹框居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭无法操作
            jDialog.setModal(true);
            //显示弹框
            jDialog.setVisible(true);


        } else if(obj == Miniwa_Tsumiki){
            girlname = "Miniwa_Tsumiki";
            step = 0;
            initData();
            initImage();
        }else if(obj == Nagisa_Kubo){
            girlname = "Nagisa_kubo";
            step = 0;
            initData();
            initImage();

        }

    }
}
